import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

import study.apache.thrift.tutorial.Calculator;
import study.apache.thrift.tutorial.InvalidOperation;
import study.apache.thrift.tutorial.Operation;
import study.apache.thrift.tutorial.Work;

public class Client {
	public static void main(String[] args) {
		// 传输层
		// * TSocket- 使用堵塞式I/O进行传输，也是最常见的模式。
		// * TFramedTransport- 使用非阻塞方式，按块的大小，进行传输，类似于Java中的NIO。
		// * TFileTransport- 顾名思义按照文件的方式进程传输，虽然这种方式不提供Java的实现，但是实现起来非常简单。
		// * TMemoryTransport- 使用内存I/O，就好比Java中的ByteArrayOutputStream实现。
		// * TZlibTransport- 使用执行zlib压缩，不提供Java的实现。

		TTransport transport = new TSocket("localhost", 9090);

		// 协议层
		// * TBinaryProtocol – 二进制编码格式进行数据传输。
		// * TCompactProtocol – 这种协议非常有效的，使用Variable-Length Quantity
		// (VLQ)编码对数据进行压缩。
		// * TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
		// * TSimpleJSONProtocol – 这种节约只提供JSON只写的协议，适用于通过脚本语言解析

		TProtocol protocol = new TBinaryProtocol(transport);

		Calculator.Client client = new Calculator.Client(protocol);

		try {
			transport.open();

			System.out.println(client.calculate(Operation.ADD.getValue(),
					new Work(1, 2, Operation.ADD)));
			System.out.println(client.calculate(Operation.SUBTRACT.getValue(),
					new Work(3, 5, Operation.SUBTRACT)));
			System.out.println(client.calculate(Operation.MULTIPLY.getValue(),
					new Work(4, 2, Operation.MULTIPLY)));
			System.out.println(client.calculate(Operation.DIVIDE.getValue(),
					new Work(1, 0, Operation.DIVIDE)));
		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (InvalidOperation e) {
			e.printStackTrace();
		} catch (TException e) {
			e.printStackTrace();
		} finally {
			// 最后一定要调用close来释放资源
			transport.close();
		}
	}
}
